﻿// 204 [SCOI2005] 互不侵犯.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <memory.h>


using namespace std;

/*
http://oj.daimayuan.top/course/22/problem/901

在 𝑛×𝑛 的棋盘里面放 𝑘 个国王，使它们不重叠且互不攻击，求共有多少种摆放方案。 

每个国王能攻击到它周围一圈 8 个格子。

输入格式
一行两个整数 n,k。

输出格式
输出一行一个数字，表示方案数。

样例输入
3 2
样例输出
16
数据规模
对于所有数据，保证 1≤n≤9,0≤k≤n2。
*/
int n, m,v[1001];
long long f[10][1001][82];  //f[i][j][k] 第i行中状态为j 有k个国王的放置方案数
bool b[1001];

int main()
{
	scanf("%d%d",&n,&m);

	for (int i = 0; i < 1 << n; i++) {
		v[i] = 0;
		//得到i在二进制下中有多少个1
		for (int j = i; j; j = j & (j - 1))
			v[i]++;
		//确定二进制i中没有连续的1
		b[i] = ((i & (i << 1)) == 0);
	}

	memset(f, 0, sizeof f);
	f[0][0][0] = 1;
	for (int i = 1; i <= n; i++)
		for (int j = 0; j < 1 << n; j++)
			for (int k = 0; k <= n * n; k++)
				if (f[i - 1][j][k])
					for (int l = 0; l < 1 << n; l++)
						if (((l & j) == 0) && (((l << 1) & j) == 0) && (((l >> 1) & j )== 0) && b[l])
							f[i][l][k + v[l]] += f[i - 1][j][k];

	long long ans = 0;
	for (int i = 0; i < 1 << n; i++)
		ans += f[n][i][m];

	printf("%lld\n",ans);
	return 0;
}
 